package cn.tedu.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*完成自定义注解*/
public class TestAnnotation {

}

/**一.定义自定义注解*/
    /*1.首先注意:注解定义的语法与Java不同
    * 2.定义自定义注解的格式:@interface  注解名
    * */
/**二.通过@target注解标记自定义注解可以使用的位置*/
     /*3.通过元注解@Target规定自定义注解可以使用的位置
     * 我们使用"Elementation.静态常量"的方式来指定自定义注解具体可以加在什么位置在
     * 而且,值可以写多个,格式@Target({ElementType.XXX1,ElementType.XXX2})
     * */
@Target({ElementType.METHOD,ElementType.TYPE})
/**三.通过@Retention注解标记自定义的生命周期*/
/*4.通过元注解@Retention规定自定义注解的生命周期
* 我们使用"RetentionPolicy.静态常量"的方式来指定自定义注解的生命周期
* 注意:值只能写一个:SOURCE CLASS RUNTIME 3选1*/
@Retention(RetentionPolicy.RUNTIME)
@interface Rice{
    /**五.可以给注解进行功能挣强--添加注解的属性*/
    /*6.注意:int age();不是方法的定义,而是给自定义注解添加了普通属性age*/
    //int age();
    int age() default 0;//给自定义添加的普通属性赋予默认值0
    /*注解中还可以添加特殊属性value
    * 特殊属性的定义与普通属性一样,主要是使用方法不同
    * 注意:特殊属性的名字一定要叫value,但是类型不做限制
    * 特殊属性也可以赋予默认值,格式与普通属性的一样,不能简写*/
    //String value();//定义一个特殊属性value,类型是String
    String value() default "Lemon";
}
/*5.注解使用的格式:@注解名*/
/**四.定义一个类来测试自定义注解*/
//@Rice
class TestAnno{
    /*测试1:分别给TestAnno类  name属性  eat方法上都添加Rice注解
    * 结论:属性上的注解报错,说明自定义注解可以加在什么位置,由@Target决定
    * */
    //@Rice报错了
    String name;
    /*测试2:当我们给Rice注解添加了一个age属性后,@Rice注解使用时直接报错
    * 结论:当注解没有定义属性时,可以直接使用
    *      当注解定义属性时,必须给属性赋值,格式:@Rice(age=10)*/

    /*测试3;给age属性赋予默认值以后,可以直接使用@Ricec注解
    * 不需要给age属性赋值,因为age属性已经有默认值0了*/
    //@Rice
    /*测试4:给Rice注解添加了特殊属性value以后,也必须给属性赋值
    * 只不过特殊属性赋值时可以简写成@Rice("Apple")*/

    /*测试 5:如果特殊属性也赋予了默认值,那么可以直接使用这个注解
    * 如果想要给注解的所有熟悉赋值,那每条赋值都不能简写*/
    @Rice("Apple")
    public void eat(){
        System.out.println("eat方法");
    }
}